Lectura de los datos

Se contruyo la base de datos con tres campos: fecha, tasa representativa del mercado y precio del barril del petróleo tipo brent, dado que este desde 2008 es el precio de referencia para la compañia Ecopetrol. La base de datos se aumenta utilizando variables indicadoras para los días de la semana, los meses del año. La fuente de información para la serie del Brent es a través de U.S. Energy Information Administration (EIA), y para la tasa representativa del mercado (TRM) es el Banco de la República (BanRep) cargamos estas series a las cuales le asignaremos el nombre de Base.

#install.packages("quantmod")
#install.packages("tidyverse")
#install.packages("dplyr")
#install.packages("ggplot2")
library(quantmod)
library(tidyverse)
library(ggplot2)
library(dplyr)
library(readr)
library(lubridate)
library(stats4)
library(fUnitRoots)
library(aTSA)
library(timeSeries)
library(timeDate)
library(timsac)
getwd()
[1] "C:/Users/juanhena/Documents/SURA"
#setwd("/Users/jfhenaoduque/Google Drive/SURA")
setwd("C:/Users/juanhena/Documents/SURA")
# Base de datos
# PUNTO 1 -----------------------------------------------------------------
Base<-read.csv("BDPunto1.csv", sep=",", dec=".")

BDPunto1 <- read_delim("BDPunto1.csv", ",", 
                       escape_double = FALSE, trim_ws = TRUE)

BDPunto1 <- separate(BDPunto1,"Fecha",c("day","month","year"), sep= "/")


#mensual

BDPunto1_m <- BDPunto1 %>% group_by(month,year) %>% summarize(mean_trm = mean(trm),
                                                              mean_brent = mean(brent, na.rm = T))

BDPunto1_m <- BDPunto1_m %>% arrange(year)

#anual

BDPunto1_y <- BDPunto1 %>% group_by(year) %>% summarize(mean_trm = mean(trm),
                                                        mean_brent = mean(brent, 
                                                                          na.rm = T))

En el código anterior, se entenderá que BDPunto1 es el nombre que tomará nuestra serie diaria. La base BDPunto1_m será nuestra serie en frecuencia mensual y la base BDPunto1_y será nuestra serie con frecuencia anual Como al momento de cargar los datos, Estos se verán como una hoja plana de información, es decir, el programa leerá los datos, pero asumirá que es una impresión, no manipulable; se contrarresta este inconveniente introducimendo el comando attach que nos ayudará a seccionar la información, dándole la opción al programa de transformar la información como si fuera una serie cargada en Excel, brindándonos completa manipulación.:

attach(Base)
#attach(BDPunto1)
#attach(BDPunto1_m)
#attach(BDPunto1_y)

Otro problema identificable en R es el hecho que por defecto los resultados del programa siempre seran vistos en formato de notación cientifica cuando los datos tienen muchos decimales. Entonces, para modificar los resultados, a fin de obtener el resultado con los decimales completos usamos la función:

options(scipen = 999)
NOTA

Sobre la descarga de los datos: Inicialmente intente hacer la descarga del Brent por Yahoo Finance con frecuencia diaria del tickey BZ=F pero este no fue posible, ya que solo me generaba los últimos 20 datos, para testear si era algo del código o error mío (capa 8) lo probe con el del WTI que tiene etiqueta CL=F y la descarga si se efectuaba. No obstante, dado que la economía colombiana tiene como precio de referencia desde 2008 el Brent, realice su descarga en EIA que recoge las cifras arrojadas por Thomson Reuters


Realizamos los gráficos de la TRM y el precio del petróleo Brent en sus diferentes frecuencias:

plot(as.ts(BDPunto1$trm))

plot(as.ts(BDPunto1$brent))

plot(as.ts(BDPunto1_m$mean_trm))

plot(as.ts(BDPunto1_m$mean_brent))

plot(as.ts(BDPunto1_y$mean_trm))

plot(as.ts(BDPunto1_y$mean_brent))

Ahora gráficamos los datos con el fin de darnos una idea sobre los comportamientos de la TRM y el precio del brent library(plotly)

Base$Fecha<-as.Date(Base$Fecha,"%d/%m/%y")
library(plotly)
package 㤼㸱plotly㤼㸲 was built under R version 3.6.3Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: 㤼㸱plotly㤼㸲

The following object is masked from 㤼㸱package:timeSeries㤼㸲:

    filter

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    last_plot

The following object is masked from 㤼㸱package:stats㤼㸲:

    filter

The following object is masked from 㤼㸱package:graphics㤼㸲:

    layout
plot_ly(data=subset(Base, subset= (Fecha>="2008-01-01")),
        x = ~Fecha,
        y = ~trm,
        type= "scatter", mode="lines",
        line=list(width=1,color="Blue"))%>%
layout(title="Tasa Representativa del Mercado",
        xaxis=list(title="Día"),
        yaxis=list(title="COP/USD"))
`arrange_()` is deprecated as of dplyr 0.7.0.
Please use `arrange()` instead.
See vignette('programming') for more help
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.
Base$Fecha<-as.Date(Base$Fecha,"%d/%m/%y")
library(plotly)
plot_ly(data=subset(Base, subset= (Fecha>="2008-01-01")),
        x = ~Fecha,
        y = ~brent,
        type= "scatter", mode="lines",
        line=list(width=1,color="Red"))%>%
layout(title="Brent",
        xaxis=list(title="Día"),
        yaxis=list(title="Precio barril Brent (USD)"))

Gráfico Boxplot

Utilizamos el diagrama de cajas y bigotes para explorar posibles relaciones


boxplot(BDPunto1_m$mean_trm)
boxplot(BDPunto1_m$mean_brent)

BDPunto1_m$month<-as.Date(Base$month,"%m")
plot_ly(data=subset(BDPunto1_m, subset= (BDPunto1_m$month<="01")),
        x = ~month,
        y = ~trm_mean,
        type = "box")%>%
  layout(title="TRM Mensual",
         xaxis=list(title="Meses"),
         yaxis=list(title="COP/USD"))

Matriz de correlación

Con el fin de tener un análisis más completo incluimos los rezagos de la variable de interés

\[\begin{aligned} Corr(trm,brent)= Cov(trm,brent)/(S(trm)S(brent)) \end{aligned}\]

# Funciones -----
rezaga <- function(x,nlag){
  rez <- cbind(as.ts(x),lag(x,nlag))
  lagged <- rez[1:length(x),2]
  return(lagged)
} 
corsi <- function(y,x1){
  
  correlacion <- matrix(data = NA, nrow = 1, ncol = 5)
  correlacion[1,1] <- cor(y,rezaga(x1,0),use = "pairwise.complete.obs")
  correlacion[1,2] <- cor(y,rezaga(x1,-1),use ="pairwise.complete.obs")
  correlacion[1,3] <- cor(y,rezaga(x1,-2),use = "pairwise.complete.obs")
  correlacion[1,4] <- cor(y,rezaga(x1,-3),use = "pairwise.complete.obs")
  correlacion[1,5] <- cor(y,rezaga(x1,-4),use = "pairwise.complete.obs")
  
  rownames(correlacion) <- c("Brent")  
  colnames(correlacion) <- c("0","-1","-2","-3","-4")
  return(correlacion)
}
brent1<-as.ts(Base[-c(1:505),]$brent)
trm1<-as.ts(Base[-c(1:505),]$trm)
corsi(trm1,brent1)
               0         -1         -2        -3         -4
Brent -0.8635655 -0.8637155 -0.8633608 -0.862887 -0.8623808

Dado que las dos series observadas sin importar su frecuencia presentan tendencia es pertinente realizarle pruebas de raíces unitarias para determinar la pertinencia de hacer la correlación de estas dos variables niveles o si se deben realizar en retornos.

#install.packages("fUnitRoots")
adf.test(trm1)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
      lag  ADF p.value
 [1,]   0 1.71   0.978
 [2,]   1 1.45   0.962
 [3,]   2 1.41   0.959
 [4,]   3 1.36   0.956
 [5,]   4 1.43   0.961
 [6,]   5 1.38   0.957
 [7,]   6 1.42   0.960
 [8,]   7 1.41   0.960
 [9,]   8 1.41   0.960
Type 2: with drift no trend 
      lag     ADF p.value
 [1,]   0  0.2206   0.973
 [2,]   1 -0.0172   0.954
 [3,]   2 -0.0449   0.952
 [4,]   3 -0.0982   0.946
 [5,]   4 -0.0505   0.952
 [6,]   5 -0.1089   0.945
 [7,]   6 -0.0507   0.952
 [8,]   7 -0.0557   0.951
 [9,]   8 -0.0395   0.952
Type 3: with drift and trend 
      lag   ADF p.value
 [1,]   0 -2.40   0.407
 [2,]   1 -2.64   0.305
 [3,]   2 -2.70   0.283
 [4,]   3 -2.76   0.258
 [5,]   4 -2.66   0.298
 [6,]   5 -2.71   0.277
 [7,]   6 -2.68   0.291
 [8,]   7 -2.69   0.285
 [9,]   8 -2.70   0.281
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
adf.test(brent1)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
      lag    ADF p.value
 [1,]   0 -0.776   0.401
 [2,]   1 -0.763   0.406
 [3,]   2 -0.730   0.418
 [4,]   3 -0.720   0.421
 [5,]   4 -0.736   0.416
 [6,]   5 -0.736   0.416
 [7,]   6 -0.767   0.405
 [8,]   7 -0.748   0.412
 [9,]   8 -0.763   0.406
Type 2: with drift no trend 
      lag   ADF p.value
 [1,]   0 -1.01   0.696
 [2,]   1 -1.05   0.683
 [3,]   2 -1.07   0.678
 [4,]   3 -1.06   0.680
 [5,]   4 -1.09   0.671
 [6,]   5 -1.07   0.677
 [7,]   6 -1.13   0.655
 [8,]   7 -1.20   0.630
 [9,]   8 -1.25   0.613
Type 3: with drift and trend 
      lag   ADF p.value
 [1,]   0 -2.20   0.494
 [2,]   1 -2.26   0.466
 [3,]   2 -2.34   0.434
 [4,]   3 -2.35   0.428
 [5,]   4 -2.35   0.429
 [6,]   5 -2.33   0.437
 [7,]   6 -2.34   0.432
 [8,]   7 -2.46   0.383
 [9,]   8 -2.49   0.370
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
PP.test(trm1)

    Phillips-Perron Unit Root Test

data:  trm1
Dickey-Fuller = -2.6642, Truncation lag parameter = 9, p-value = 0.2971
PP.test(trm1)

    Phillips-Perron Unit Root Test

data:  trm1
Dickey-Fuller = -2.6642, Truncation lag parameter = 9, p-value = 0.2971
kpss.test(trm1)
KPSS Unit Root Test 
alternative: nonstationary 
 
Type 1: no drift no trend 
 lag   stat p.value
  12 0.0863     0.1
----- 
 Type 2: with drift no trend 
 lag  stat p.value
  12 0.119     0.1
----- 
 Type 1: with drift and trend 
 lag   stat p.value
  12 0.0473     0.1
----------- 
Note: p.value = 0.01 means p.value <= 0.01 
    : p.value = 0.10 means p.value >= 0.10 
kpss.test(brent1)
KPSS Unit Root Test 
alternative: nonstationary 
 
Type 1: no drift no trend 
 lag  stat p.value
  12 0.238     0.1
----- 
 Type 2: with drift no trend 
 lag  stat p.value
  12 0.273     0.1
----- 
 Type 1: with drift and trend 
 lag   stat p.value
  12 0.0929     0.1
----------- 
Note: p.value = 0.01 means p.value <= 0.01 
    : p.value = 0.10 means p.value >= 0.10 

Como se observa en las tablas, tanto para la prueba de Dickey-Fuller aumentada (ADF), Phillips-Perron (PP), y Kwiatowski, Phillips, Shy, Schmidt (KPSS) se encuentra que la serie tiene raíces unitarias y por lo tanto se debe diferenciar la serie.

log <- data.frame(lapply(Base[,-1], log)) # saca logaritmos de determinado dataframe
names(log) <- paste("l",names(log),sep = "") # le da nombre a este nuevo dataframe
attach(log)
ret <- data.frame(lapply(log,diff,differences = 1)) # saca las diferencias de los logaritmos
names(ret) <- paste("r",names(ret),sep = "") # le da nombre a ese nuevo data frame
attach(ret)

Ahora tenemos la serie en retornos logaritmicos, con esto podemos procedemos a realizarle las pruebas de raíces unitarias a la trm y al brent en rendimientos logaritmicos y ver si cumplen los supuestos de estacionariedad que nos permitan tener mayor precisión sobre la asociación lineal entre estas dos variables y potencialmente poder realizar estimaciones y hacer inferencia estadística.

rlbrent1<-as.ts(ret[-c(1:504),]$rlbrent)
rltrm1<-as.ts(ret[-c(1:504),]$rltrm)
adf.test(rltrm1)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
      lag   ADF p.value
 [1,]   0 -45.3    0.01
 [2,]   1 -35.1    0.01
 [3,]   2 -28.9    0.01
 [4,]   3 -25.9    0.01
 [5,]   4 -22.7    0.01
 [6,]   5 -21.3    0.01
 [7,]   6 -19.8    0.01
 [8,]   7 -18.3    0.01
 [9,]   8 -16.5    0.01
Type 2: with drift no trend 
      lag   ADF p.value
 [1,]   0 -45.3    0.01
 [2,]   1 -35.2    0.01
 [3,]   2 -29.0    0.01
 [4,]   3 -25.9    0.01
 [5,]   4 -22.8    0.01
 [6,]   5 -21.3    0.01
 [7,]   6 -19.8    0.01
 [8,]   7 -18.4    0.01
 [9,]   8 -16.5    0.01
Type 3: with drift and trend 
      lag   ADF p.value
 [1,]   0 -45.4    0.01
 [2,]   1 -35.2    0.01
 [3,]   2 -29.0    0.01
 [4,]   3 -26.0    0.01
 [5,]   4 -22.8    0.01
 [6,]   5 -21.3    0.01
 [7,]   6 -19.9    0.01
 [8,]   7 -18.4    0.01
 [9,]   8 -16.6    0.01
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
adf.test(rlbrent1)
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
      lag   ADF p.value
 [1,]   0 -54.2    0.01
 [2,]   1 -40.9    0.01
 [3,]   2 -32.0    0.01
 [4,]   3 -26.1    0.01
 [5,]   4 -24.3    0.01
 [6,]   5 -22.4    0.01
 [7,]   6 -18.8    0.01
 [8,]   7 -15.7    0.01
 [9,]   8 -15.4    0.01
Type 2: with drift no trend 
      lag   ADF p.value
 [1,]   0 -54.2    0.01
 [2,]   1 -40.9    0.01
 [3,]   2 -32.0    0.01
 [4,]   3 -26.1    0.01
 [5,]   4 -24.3    0.01
 [6,]   5 -22.4    0.01
 [7,]   6 -18.8    0.01
 [8,]   7 -15.7    0.01
 [9,]   8 -15.4    0.01
Type 3: with drift and trend 
      lag   ADF p.value
 [1,]   0 -54.2    0.01
 [2,]   1 -40.9    0.01
 [3,]   2 -32.0    0.01
 [4,]   3 -26.1    0.01
 [5,]   4 -24.3    0.01
 [6,]   5 -22.4    0.01
 [7,]   6 -18.8    0.01
 [8,]   7 -15.7    0.01
 [9,]   8 -15.5    0.01
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
PP.test(rltrm1)

    Phillips-Perron Unit Root Test

data:  rltrm1
Dickey-Fuller = -45.285, Truncation lag parameter = 9, p-value = 0.01
PP.test(rltrm1)

    Phillips-Perron Unit Root Test

data:  rltrm1
Dickey-Fuller = -45.285, Truncation lag parameter = 9, p-value = 0.01
kpss.test(rltrm1)
KPSS Unit Root Test 
alternative: nonstationary 
 
Type 1: no drift no trend 
 lag  stat p.value
  12 0.572     0.1
----- 
 Type 2: with drift no trend 
 lag  stat p.value
  12 0.163     0.1
----- 
 Type 1: with drift and trend 
 lag   stat p.value
  12 0.0751     0.1
----------- 
Note: p.value = 0.01 means p.value <= 0.01 
    : p.value = 0.10 means p.value >= 0.10 
kpss.test(rlbrent1)
KPSS Unit Root Test 
alternative: nonstationary 
 
Type 1: no drift no trend 
 lag   stat p.value
  12 0.0704     0.1
----- 
 Type 2: with drift no trend 
 lag  stat p.value
  12 0.071     0.1
----- 
 Type 1: with drift and trend 
 lag   stat p.value
  12 0.0466     0.1
----------- 
Note: p.value = 0.01 means p.value <= 0.01 
    : p.value = 0.10 means p.value >= 0.10 

Ahora con los retornos logarítmicos encontramos que el Brent y la TRM son estacionarias

corsi(rltrm1,rlbrent1)
               0         -1          -2          -3          -4
Brent 0.01822319 -0.3350837 -0.08395169 -0.01031557 -0.03704103

Observese que ahora esta relación es positiva, y posiblemente bajo una estimación contemporanea el coeficiente estimado entre esas dos variables sea significativo. No obstante podemos pensar *** Ahora procedemos a obtener el promedio anual para la tasa representativa del mercado

attach(BDPunto1_y)
aggregate(mean_trm~year,data=BDPunto1_y, FUN=mean)

Ahora procedemos a obtener el promedio anual del precio internacional del petróleo

aggregate(mean_brent~year,data=BDPunto1_y, FUN=mean)

Ahora obtenemos el precio promedio para cada mes y cada año

aggregate(mean_trm~month*year,data=BDPunto1_m, FUN=mean)
aggregate(mean_brent~month*year,data=BDPunto1_m, FUN=mean)
BDPunto1_m$month<-strftime(BDPunto1_m$month, format = "%B")
BDPunto1_m$month<-strftime(BDPunto1_m$month, levels= month.name)
aggregate(mean_brent~*month,data=BDPunto1_m,FUN=mean)

Procedemos a representarlo en un gráfico

aggregate(mean_trm~year*month,data=BDPunto1_m, FUN=mean)%>% 
  plot_ly(
          x = ~month,
         y = ~mean_trm,
         type = "scatter" ,mode = "lines",
         split = ~year,
         line=list(width=1))%>%
  layout(title='Promedio diario mensual de la TRM',
         xaxis=list(title="Días"),
         yaxis=list(title="COP/USD"))
aggregate(mean_brent~year*month,data=BDPunto1_m, FUN=mean)%>% 
  plot_ly(
          x = ~month,
         y = ~mean_brent,
         type = "scatter" ,mode = "lines",
         split = ~year,
         line=list(width=1))%>%
  layout(title='Promedio diario mensual del Barril de Petróleo Brent',
         xaxis=list(title="Días"),
         yaxis=list(title="USD"))

Importancia de estas dos variables

La actividad económica colombiana ha sufrido notables cambios respecto a su materia prima de interés, casi durante todo el siglo XX el precio internacional de referencia para la economía era el precio del café, no obstante desde el descubrimiento de los yacimientos de Cusiana y Rubiales hizo que lentamente la actividad del petróleo tomará mayor relevancia para nuestra economía al constituirse en el principal producto de exportación. La importancia del precio del petróleo es tal que durante la crisis del petróleo en el 2014 se tuvieron consecuencias importantes para el país , que obligaron a realizar reformas tributarias, ajustar el gasto estatal. Como se observa en la gráfica del Brent, este ha tenido caídas importantes en 2014 como consecuencia del descubrimiento en técnicas de Shale Gas y Shale Oil, y la sobreoferta de la OPEP. Durante este año, hubo notables caídas en el precio del petróleo producto de unas tensiones entre la OPEP en cabeza de Arabia Saudita y Rusia llevando a deterioros en la relación entre la OPEP y la OPEP+. No obstante, todo estas disputas se solucionarían en medio del confinamiento mundial producto de la pandemia del SARS-COV2, comunmente conocido como COVID-19.

Dada la fuerte importancia que tiene para Colombia las rentas petróleras y el flujo de dinero que llega de divisas como producto de la venta de barriles de petróleo el comportamiento de la tasa representativa del mercado (trm, en adelante) depende mucho del precio internacional. Si bien, hay una dependencia entre estas variableses bueno considerar si existe una posible cointegración de estos procesos, para evitar así una posible relación espuria.

rel<-lm(ltrm~lbrent)
rel

Call:
lm(formula = ltrm ~ lbrent)

Coefficients:
(Intercept)       lbrent  
    10.0478      -0.5316  

Podemos señalar que de acuerdo a las pruebas de raíces unitarias, y bajo lo propuesto por Granger en 1986 con las pruebas de cointegración se puede asumir que la trm y el precio del petróleo brent se encuentran cointegradas, es decir, hay una relación de largo plazo entre las dos, siendo está una elasticidad de largo plazo de -0.53. Aunque no es el objetivo del trabajo sugiero un modelo de mecanismo de corrección de errores. GRANGER, C.W.J (1986) ##"Developments in the Study of Co-Integrated Economic Variables"#. Oxford Bulletin of Economics and Statistics.

Parte 2

Traemos los datos

library(quantmod)
apple<-getSymbols("AAPL", from="2019-01-01", src="yahoo", auto.assign = F)[,6]
microsoft<-getSymbols("MSFT", from="2019-01-01", src="yahoo", auto.assign = F)[,6] 
amazon<-getSymbols("AMZN", from="2019-01-01", src="yahoo", auto.assign = F)[,6] 
facebook<-getSymbols("FB", from="2019-01-01", src="yahoo", auto.assign = F)[,6] 
google<-getSymbols("GOOGL", from="2019-01-01", src="yahoo", auto.assign = F)[,6] 
Datos.prueba<-data.frame(apple, microsoft, amazon, facebook, google)

Las series escogidas, fueron las tecnológicas, dada su alta valoración en el mercado y el interés que despiertan en especial por sus avances que han llevado a pensar que estas incursionen en los mercados financieros con sus propios bancos o hasta sus propias monedas como intento realizarlo Facebook con Libra, la cual ha tenido una serie de tropiezos desde su anuncio, en los que socios estrategicos del proyecto han decidido retirar su participación en la iniciativa de Facebook.

barChart(apple)

barChart(amazon)

barChart(facebook)

barChart(google)

barChart(microsoft)

En general observamos que todas estas series tuvieron una caída importante en el mes de marzo producto de la pandemia del COVID-19, aunque han tenido una notable recuperación, dado que este es uno de los sectores menos afectado por la pandemia e incluso algunas de estas empresas, Amazon por ejemplo, se ha visto favorecida por los confinamientos generalizados a nivel mundial debido a que su modelo de negocio se basa en las compras por internet. ## Apple

# Calculamos los rendimientos
applerends<-ROC(apple,type="discrete",na.pad = T)
applerendl<-ROC(apple,type="continuous",na.pad = T)
Datos.apple<-data.frame(apple,applerends,applerendl)
plot(Datos.apple$AAPL.Adjusted.1, type="l")

plot(Datos.apple$AAPL.Adjusted.2, type="l")

Amazon

# Calculamos los rendimientos
amazonrends<-ROC(amazon,type="discrete",na.pad = T)
amazonrendl<-ROC(amazon,type="continuous",na.pad = T)
Datos.amazon<-data.frame(amazon,amazonrends,amazonrendl)
plot(Datos.amazon$AMZN.Adjusted.1, type="l")

plot(Datos.amazon$AMZN.Adjusted.2, type="l")

Facebook

# Calculamos los rendimientos
facebookrends<-ROC(facebook,type="discrete",na.pad = T)
facebookrendl<-ROC(facebook,type="continuous",na.pad = T)
Datos.facebook<-data.frame(facebook,facebookrends,facebookrendl)
plot(Datos.facebook$FB.Adjusted.1, type="l")

plot(Datos.facebook$FB.Adjusted.2, type="l")

Google

# Calculamos los rendimientos
googlerends<-ROC(google,type="discrete",na.pad = T)
googlerendl<-ROC(google,type="continuous",na.pad = T)
Datos.google<-data.frame(google,googlerends,googlerendl)
plot(Datos.google$GOOGL.Adjusted.1, type="l")

plot(Datos.google$GOOGL.Adjusted.2, type="l")

Microsoft

# Calculamos los rendimientos
microsoftrends<-ROC(microsoft,type="discrete",na.pad = T)
microsoftrendl<-ROC(microsoft,type="continuous",na.pad = T)
Datos.microsoft<-data.frame(microsoft,microsoftrends,microsoftrendl)
plot(Datos.microsoft$MSFT.Adjusted.1, type="l")

plot(Datos.microsoft$MSFT.Adjusted.2, type="l")

Punto 3 SQL

Se encuentra en otro archivo

LS0tDQp0aXRsZTogIlBydWViYSBDb252b2NhdG9yaWEgQW5hbGlzdGEgZGUgSW52ZXJzacOzbiINCmF1dGhvcjogSnVhbiBGZXJuYW5kbyBIZW5hbyBEdXF1ZQ0KZGF0ZTogXHRvZGF5DQpvdXRwdXQ6DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQotLS0NCg0KIyBMZWN0dXJhIGRlIGxvcyBkYXRvcw0KU2UgY29udHJ1eW8gbGEgYmFzZSBkZSBkYXRvcyBjb24gdHJlcyBjYW1wb3M6IGZlY2hhLCB0YXNhIHJlcHJlc2VudGF0aXZhIGRlbCBtZXJjYWRvIHkgcHJlY2lvIGRlbCBiYXJyaWwgZGVsIHBldHLDs2xlbyB0aXBvIGJyZW50LCBkYWRvIHF1ZSBlc3RlIGRlc2RlIDIwMDggZXMgZWwgcHJlY2lvIGRlIHJlZmVyZW5jaWEgcGFyYSBsYSBjb21wYcOxaWEgRWNvcGV0cm9sLiBMYSBiYXNlIGRlIGRhdG9zIHNlIGF1bWVudGEgdXRpbGl6YW5kbyB2YXJpYWJsZXMgaW5kaWNhZG9yYXMgcGFyYSBsb3MgZMOtYXMgZGUgbGEgc2VtYW5hLCBsb3MgbWVzZXMgZGVsIGHDsW8uIA0KTGEgZnVlbnRlIGRlIGluZm9ybWFjacOzbiBwYXJhIGxhIHNlcmllIGRlbCBCcmVudCBlcyBhIHRyYXbDqXMgZGUgVS5TLiBFbmVyZ3kgSW5mb3JtYXRpb24gQWRtaW5pc3RyYXRpb24gKEVJQSksIHkgcGFyYSBsYSB0YXNhIHJlcHJlc2VudGF0aXZhIGRlbCBtZXJjYWRvIChUUk0pIGVzIGVsIEJhbmNvIGRlIGxhIFJlcMO6YmxpY2EgKEJhblJlcCkgY2FyZ2Ftb3MgZXN0YXMgc2VyaWVzIGEgbGFzIGN1YWxlcyBsZSBhc2lnbmFyZW1vcyBlbCBub21icmUgZGUgQmFzZS4NCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KI2luc3RhbGwucGFja2FnZXMoImRwbHlyIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCg0KbGlicmFyeShxdWFudG1vZCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RhdHM0KQ0KbGlicmFyeShmVW5pdFJvb3RzKQ0KbGlicmFyeShhVFNBKQ0KbGlicmFyeSh0aW1lU2VyaWVzKQ0KbGlicmFyeSh0aW1lRGF0ZSkNCmxpYnJhcnkodGltc2FjKQ0KZ2V0d2QoKQ0KI3NldHdkKCIvVXNlcnMvamZoZW5hb2R1cXVlL0dvb2dsZSBEcml2ZS9TVVJBIikNCnNldHdkKCJDOi9Vc2Vycy9qdWFuaGVuYS9Eb2N1bWVudHMvU1VSQSIpDQpgYGANCg0KYGBge3IgZXZhbCA9IEZBTFNFfQ0KIyBCYXNlIGRlIGRhdG9zDQojIFBVTlRPIDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkJhc2U8LXJlYWQuY3N2KCJCRFB1bnRvMS5jc3YiLCBzZXA9IiwiLCBkZWM9Ii4iKQ0KDQpCRFB1bnRvMSA8LSByZWFkX2RlbGltKCJCRFB1bnRvMS5jc3YiLCAiLCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKQ0KDQpCRFB1bnRvMSA8LSBzZXBhcmF0ZShCRFB1bnRvMSwiRmVjaGEiLGMoImRheSIsIm1vbnRoIiwieWVhciIpLCBzZXA9ICIvIikNCg0KDQojbWVuc3VhbA0KDQpCRFB1bnRvMV9tIDwtIEJEUHVudG8xICU+JSBncm91cF9ieShtb250aCx5ZWFyKSAlPiUgc3VtbWFyaXplKG1lYW5fdHJtID0gbWVhbih0cm0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuX2JyZW50ID0gbWVhbihicmVudCwgbmEucm0gPSBUKSkNCg0KQkRQdW50bzFfbSA8LSBCRFB1bnRvMV9tICU+JSBhcnJhbmdlKHllYXIpDQoNCiNhbnVhbA0KDQpCRFB1bnRvMV95IDwtIEJEUHVudG8xICU+JSBncm91cF9ieSh5ZWFyKSAlPiUgc3VtbWFyaXplKG1lYW5fdHJtID0gbWVhbih0cm0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuX2JyZW50ID0gbWVhbihicmVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCkpDQpgYGANCg0KRW4gZWwgY8OzZGlnbyBhbnRlcmlvciwgc2UgZW50ZW5kZXLDoSBxdWUgKipCRFB1bnRvMSoqIGVzIGVsIG5vbWJyZSBxdWUgdG9tYXLDoSBudWVzdHJhIHNlcmllIGRpYXJpYS4gTGEgYmFzZSAqKkJEUHVudG8xX20qKiBzZXLDoSBudWVzdHJhIHNlcmllIGVuIGZyZWN1ZW5jaWEgbWVuc3VhbCB5IGxhIGJhc2UgKipCRFB1bnRvMV95Kiogc2Vyw6EgbnVlc3RyYSBzZXJpZSBjb24gZnJlY3VlbmNpYSBhbnVhbA0KQ29tbyBhbCBtb21lbnRvIGRlIGNhcmdhciBsb3MgZGF0b3MsIEVzdG9zIHNlIHZlcsOhbiBjb21vIHVuYSBob2phIHBsYW5hIGRlIGluZm9ybWFjacOzbiwgZXMgZGVjaXIsIGVsIHByb2dyYW1hIGxlZXLDoSBsb3MgZGF0b3MsIHBlcm8gYXN1bWlyw6EgcXVlIGVzIHVuYSBpbXByZXNpw7NuLCBubyBtYW5pcHVsYWJsZTsgc2UgY29udHJhcnJlc3RhIGVzdGUgaW5jb252ZW5pZW50ZSBpbnRyb2R1Y2ltZW5kbyBlbCBjb21hbmRvICoqYXR0YWNoKiogcXVlIG5vcyBheXVkYXLDoSBhIHNlY2Npb25hciBsYSBpbmZvcm1hY2nDs24sIGTDoW5kb2xlIGxhIG9wY2nDs24gYWwgcHJvZ3JhbWEgZGUgdHJhbnNmb3JtYXIgbGEgaW5mb3JtYWNpw7NuIGNvbW8gc2kgZnVlcmEgdW5hIHNlcmllIGNhcmdhZGEgZW4gRXhjZWwsIGJyaW5kw6FuZG9ub3MgY29tcGxldGEgbWFuaXB1bGFjacOzbi46IA0KDQpgYGB7ciBldmFsID0gRkFMU0V9DQphdHRhY2goQmFzZSkNCiNhdHRhY2goQkRQdW50bzEpDQojYXR0YWNoKEJEUHVudG8xX20pDQojYXR0YWNoKEJEUHVudG8xX3kpDQpgYGANCk90cm8gcHJvYmxlbWEgaWRlbnRpZmljYWJsZSBlbiBSIGVzIGVsIGhlY2hvIHF1ZSBwb3IgZGVmZWN0byBsb3MgcmVzdWx0YWRvcyBkZWwgcHJvZ3JhbWEgc2llbXByZSBzZXJhbiB2aXN0b3MgZW4gZm9ybWF0byBkZSBub3RhY2nDs24gY2llbnRpZmljYSBjdWFuZG8gbG9zIGRhdG9zIHRpZW5lbiBtdWNob3MgZGVjaW1hbGVzLiBFbnRvbmNlcywgcGFyYSBtb2RpZmljYXIgbG9zIHJlc3VsdGFkb3MsIGEgZmluIGRlIG9idGVuZXIgZWwgcmVzdWx0YWRvIGNvbiBsb3MgZGVjaW1hbGVzIGNvbXBsZXRvcyB1c2Ftb3MgbGEgZnVuY2nDs246DQpgYGB7ciBldmFsID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCmBgYA0KDQojIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4qTk9UQSoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+KipTb2JyZSBsYSBkZXNjYXJnYSBkZSBsb3MgZGF0b3M6IEluaWNpYWxtZW50ZSBpbnRlbnRlIGhhY2VyIGxhIGRlc2NhcmdhIGRlbCBCcmVudCBwb3IgWWFob28gRmluYW5jZSBjb24gZnJlY3VlbmNpYSBkaWFyaWEgZGVsIHRpY2tleSBCWj1GIHBlcm8gZXN0ZSBubyBmdWUgcG9zaWJsZSwgeWEgcXVlIHNvbG8gbWUgZ2VuZXJhYmEgbG9zIMO6bHRpbW9zIDIwIGRhdG9zLCBwYXJhIHRlc3RlYXIgc2kgZXJhIGFsZ28gZGVsIGPDs2RpZ28gbyBlcnJvciBtw61vIChjYXBhIDgpIGxvIHByb2JlIGNvbiBlbCBkZWwgV1RJIHF1ZSB0aWVuZSBldGlxdWV0YSBDTD1GIHkgbGEgZGVzY2FyZ2Egc2kgc2UgZWZlY3R1YWJhLiBObyBvYnN0YW50ZSwgZGFkbyBxdWUgbGEgZWNvbm9tw61hIGNvbG9tYmlhbmEgdGllbmUgY29tbyBwcmVjaW8gZGUgcmVmZXJlbmNpYSBkZXNkZSAyMDA4IGVsIEJyZW50LCByZWFsaWNlIHN1IGRlc2NhcmdhIGVuIEVJQSBxdWUgcmVjb2dlIGxhcyBjaWZyYXMgYXJyb2phZGFzIHBvciBUaG9tc29uIFJldXRlcnMqKg0KDQoNCioqKg0KUmVhbGl6YW1vcyBsb3MgZ3LDoWZpY29zIGRlIGxhIFRSTSB5IGVsIHByZWNpbyBkZWwgcGV0csOzbGVvIEJyZW50IGVuIHN1cyBkaWZlcmVudGVzIGZyZWN1ZW5jaWFzOg0KDQpgYGB7cn0NCg0KcGxvdChhcy50cyhCRFB1bnRvMSR0cm0pKQ0KcGxvdChhcy50cyhCRFB1bnRvMSRicmVudCkpDQpwbG90KGFzLnRzKEJEUHVudG8xX20kbWVhbl90cm0pKQ0KcGxvdChhcy50cyhCRFB1bnRvMV9tJG1lYW5fYnJlbnQpKQ0KcGxvdChhcy50cyhCRFB1bnRvMV95JG1lYW5fdHJtKSkNCnBsb3QoYXMudHMoQkRQdW50bzFfeSRtZWFuX2JyZW50KSkNCmBgYA0KDQpBaG9yYSBncsOhZmljYW1vcyBsb3MgZGF0b3MgY29uIGVsIGZpbiBkZSBkYXJub3MgdW5hIGlkZWEgc29icmUgbG9zIGNvbXBvcnRhbWllbnRvcyBkZSBsYSBUUk0geSBlbCBwcmVjaW8gZGVsIGJyZW50DQpsaWJyYXJ5KHBsb3RseSkNCg0KYGBge3J9DQpCYXNlJEZlY2hhPC1hcy5EYXRlKEJhc2UkRmVjaGEsIiVkLyVtLyV5IikNCmxpYnJhcnkocGxvdGx5KQ0KcGxvdF9seShkYXRhPXN1YnNldChCYXNlLCBzdWJzZXQ9IChGZWNoYT49IjIwMDgtMDEtMDEiKSksDQogICAgICAgIHggPSB+RmVjaGEsDQogICAgICAgIHkgPSB+dHJtLA0KICAgICAgICB0eXBlPSAic2NhdHRlciIsIG1vZGU9ImxpbmVzIiwNCiAgICAgICAgbGluZT1saXN0KHdpZHRoPTEsY29sb3I9IkJsdWUiKSklPiUNCmxheW91dCh0aXRsZT0iVGFzYSBSZXByZXNlbnRhdGl2YSBkZWwgTWVyY2FkbyIsDQogICAgICAgIHhheGlzPWxpc3QodGl0bGU9IkTDrWEiKSwNCiAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0iQ09QL1VTRCIpKQ0KYGBgDQpgYGB7cn0NCkJhc2UkRmVjaGE8LWFzLkRhdGUoQmFzZSRGZWNoYSwiJWQvJW0vJXkiKQ0KbGlicmFyeShwbG90bHkpDQpwbG90X2x5KGRhdGE9c3Vic2V0KEJhc2UsIHN1YnNldD0gKEZlY2hhPj0iMjAwOC0wMS0wMSIpKSwNCiAgICAgICAgeCA9IH5GZWNoYSwNCiAgICAgICAgeSA9IH5icmVudCwNCiAgICAgICAgdHlwZT0gInNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIsDQogICAgICAgIGxpbmU9bGlzdCh3aWR0aD0xLGNvbG9yPSJSZWQiKSklPiUNCmxheW91dCh0aXRsZT0iQnJlbnQiLA0KICAgICAgICB4YXhpcz1saXN0KHRpdGxlPSJEw61hIiksDQogICAgICAgIHlheGlzPWxpc3QodGl0bGU9IlByZWNpbyBiYXJyaWwgQnJlbnQgKFVTRCkiKSkNCmBgYA0KKioqDQojIyMgR3LDoWZpY28gQm94cGxvdA0KVXRpbGl6YW1vcyBlbCBkaWFncmFtYSBkZSBjYWphcyB5IGJpZ290ZXMgcGFyYSBleHBsb3JhciBwb3NpYmxlcyByZWxhY2lvbmVzDQpgYGB7cn0NCg0KYm94cGxvdChCRFB1bnRvMV9tJG1lYW5fdHJtKQ0KYm94cGxvdChCRFB1bnRvMV9tJG1lYW5fYnJlbnQpDQoNCkJEUHVudG8xX20kbW9udGg8LWFzLkRhdGUoQmFzZSRtb250aCwiJW0iKQ0KcGxvdF9seShkYXRhPXN1YnNldChCRFB1bnRvMV9tLCBzdWJzZXQ9IChCRFB1bnRvMV9tJG1vbnRoPD0iMDEiKSksDQogICAgICAgIHggPSB+bW9udGgsDQogICAgICAgIHkgPSB+dHJtX21lYW4sDQogICAgICAgIHR5cGUgPSAiYm94IiklPiUNCiAgbGF5b3V0KHRpdGxlPSJUUk0gTWVuc3VhbCIsDQogICAgICAgICB4YXhpcz1saXN0KHRpdGxlPSJNZXNlcyIpLA0KICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0iQ09QL1VTRCIpKQ0KDQoNCg0KYGBgDQoNCg0KIyMjIE1hdHJpeiBkZSBjb3JyZWxhY2nDs24NCg0KQ29uIGVsIGZpbiBkZSB0ZW5lciB1biBhbsOhbGlzaXMgbcOhcyBjb21wbGV0byBpbmNsdWltb3MgbG9zIHJlemFnb3MgZGUgbGEgdmFyaWFibGUgZGUgaW50ZXLDqXMNCg0KJCRcYmVnaW57YWxpZ25lZH0NCkNvcnIodHJtLGJyZW50KT0gIENvdih0cm0sYnJlbnQpLyhTKHRybSlTKGJyZW50KSkNClxlbmR7YWxpZ25lZH0kJA0KYGBge3J9DQojIEZ1bmNpb25lcyAtLS0tLQ0KcmV6YWdhIDwtIGZ1bmN0aW9uKHgsbmxhZyl7DQogIHJleiA8LSBjYmluZChhcy50cyh4KSxsYWcoeCxubGFnKSkNCiAgbGFnZ2VkIDwtIHJlelsxOmxlbmd0aCh4KSwyXQ0KICByZXR1cm4obGFnZ2VkKQ0KfSANCmNvcnNpIDwtIGZ1bmN0aW9uKHkseDEpew0KICANCiAgY29ycmVsYWNpb24gPC0gbWF0cml4KGRhdGEgPSBOQSwgbnJvdyA9IDEsIG5jb2wgPSA1KQ0KICBjb3JyZWxhY2lvblsxLDFdIDwtIGNvcih5LHJlemFnYSh4MSwwKSx1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIikNCiAgY29ycmVsYWNpb25bMSwyXSA8LSBjb3IoeSxyZXphZ2EoeDEsLTEpLHVzZSA9InBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpDQogIGNvcnJlbGFjaW9uWzEsM10gPC0gY29yKHkscmV6YWdhKHgxLC0yKSx1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIikNCiAgY29ycmVsYWNpb25bMSw0XSA8LSBjb3IoeSxyZXphZ2EoeDEsLTMpLHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKQ0KICBjb3JyZWxhY2lvblsxLDVdIDwtIGNvcih5LHJlemFnYSh4MSwtNCksdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpDQoNCiAgDQogIHJvd25hbWVzKGNvcnJlbGFjaW9uKSA8LSBjKCJCcmVudCIpICANCiAgY29sbmFtZXMoY29ycmVsYWNpb24pIDwtIGMoIjAiLCItMSIsIi0yIiwiLTMiLCItNCIpDQogIHJldHVybihjb3JyZWxhY2lvbikNCn0NCmJyZW50MTwtYXMudHMoQmFzZVstYygxOjUwNSksXSRicmVudCkNCnRybTE8LWFzLnRzKEJhc2VbLWMoMTo1MDUpLF0kdHJtKQ0KY29yc2kodHJtMSxicmVudDEpDQpgYGANCkRhZG8gcXVlIGxhcyBkb3Mgc2VyaWVzIG9ic2VydmFkYXMgc2luIGltcG9ydGFyIHN1IGZyZWN1ZW5jaWEgcHJlc2VudGFuIHRlbmRlbmNpYSBlcyBwZXJ0aW5lbnRlIHJlYWxpemFybGUgcHJ1ZWJhcyBkZSByYcOtY2VzIHVuaXRhcmlhcyBwYXJhIGRldGVybWluYXIgbGEgcGVydGluZW5jaWEgZGUgaGFjZXIgbGEgY29ycmVsYWNpw7NuIGRlIGVzdGFzIGRvcyB2YXJpYWJsZXMgbml2ZWxlcyBvIHNpIHNlIGRlYmVuIHJlYWxpemFyIGVuIHJldG9ybm9zLg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygiZlVuaXRSb290cyIpDQphZGYudGVzdCh0cm0xKQ0KYWRmLnRlc3QoYnJlbnQxKQ0KUFAudGVzdCh0cm0xKQ0KUFAudGVzdCh0cm0xKQ0Ka3Bzcy50ZXN0KHRybTEpDQprcHNzLnRlc3QoYnJlbnQxKQ0KYGBgDQpDb21vIHNlIG9ic2VydmEgZW4gbGFzIHRhYmxhcywgdGFudG8gcGFyYSBsYSBwcnVlYmEgZGUgRGlja2V5LUZ1bGxlciBhdW1lbnRhZGEgKEFERiksIFBoaWxsaXBzLVBlcnJvbiAoUFApLCB5IEt3aWF0b3dza2ksIFBoaWxsaXBzLCBTaHksIFNjaG1pZHQgKEtQU1MpIHNlIGVuY3VlbnRyYSBxdWUgbGEgc2VyaWUgdGllbmUgcmHDrWNlcyB1bml0YXJpYXMgeSBwb3IgbG8gdGFudG8gc2UgZGViZSBkaWZlcmVuY2lhciBsYSBzZXJpZS4gDQoNCmBgYHtyfQ0KbG9nIDwtIGRhdGEuZnJhbWUobGFwcGx5KEJhc2VbLC0xXSwgbG9nKSkgIyBzYWNhIGxvZ2FyaXRtb3MgZGUgZGV0ZXJtaW5hZG8gZGF0YWZyYW1lDQpuYW1lcyhsb2cpIDwtIHBhc3RlKCJsIixuYW1lcyhsb2cpLHNlcCA9ICIiKSAjIGxlIGRhIG5vbWJyZSBhIGVzdGUgbnVldm8gZGF0YWZyYW1lDQphdHRhY2gobG9nKQ0KcmV0IDwtIGRhdGEuZnJhbWUobGFwcGx5KGxvZyxkaWZmLGRpZmZlcmVuY2VzID0gMSkpICMgc2FjYSBsYXMgZGlmZXJlbmNpYXMgZGUgbG9zIGxvZ2FyaXRtb3MNCm5hbWVzKHJldCkgPC0gcGFzdGUoInIiLG5hbWVzKHJldCksc2VwID0gIiIpICMgbGUgZGEgbm9tYnJlIGEgZXNlIG51ZXZvIGRhdGEgZnJhbWUNCmF0dGFjaChyZXQpDQpgYGANCkFob3JhIHRlbmVtb3MgbGEgc2VyaWUgZW4gcmV0b3Jub3MgbG9nYXJpdG1pY29zLCBjb24gZXN0byBwb2RlbW9zIHByb2NlZGVtb3MgYSByZWFsaXphcmxlIGxhcyBwcnVlYmFzIGRlIHJhw61jZXMgdW5pdGFyaWFzIGEgbGEgdHJtIHkgYWwgYnJlbnQgZW4gcmVuZGltaWVudG9zIGxvZ2FyaXRtaWNvcyB5IHZlciBzaSBjdW1wbGVuIGxvcyBzdXB1ZXN0b3MgZGUgZXN0YWNpb25hcmllZGFkIHF1ZSBub3MgcGVybWl0YW4gdGVuZXIgbWF5b3IgcHJlY2lzacOzbiBzb2JyZSBsYSBhc29jaWFjacOzbiBsaW5lYWwgZW50cmUgZXN0YXMgZG9zIHZhcmlhYmxlcyB5IHBvdGVuY2lhbG1lbnRlIHBvZGVyIHJlYWxpemFyIGVzdGltYWNpb25lcyB5IGhhY2VyIGluZmVyZW5jaWEgZXN0YWTDrXN0aWNhLg0KDQpgYGB7cn0NCnJsYnJlbnQxPC1hcy50cyhyZXRbLWMoMTo1MDQpLF0kcmxicmVudCkNCnJsdHJtMTwtYXMudHMocmV0Wy1jKDE6NTA0KSxdJHJsdHJtKQ0KYWRmLnRlc3Qocmx0cm0xKQ0KYWRmLnRlc3QocmxicmVudDEpDQpQUC50ZXN0KHJsdHJtMSkNClBQLnRlc3Qocmx0cm0xKQ0Ka3Bzcy50ZXN0KHJsdHJtMSkNCmtwc3MudGVzdChybGJyZW50MSkNCmBgYA0KQWhvcmEgY29uIGxvcyByZXRvcm5vcyBsb2dhcsOtdG1pY29zIGVuY29udHJhbW9zIHF1ZSBlbCBCcmVudCB5IGxhIFRSTSBzb24gZXN0YWNpb25hcmlhcw0KYGBge3J9DQpjb3JzaShybHRybTEscmxicmVudDEpDQpgYGANCk9ic2VydmVzZSBxdWUgYWhvcmEgZXN0YSByZWxhY2nDs24gZXMgcG9zaXRpdmEsIHkgcG9zaWJsZW1lbnRlIGJham8gdW5hIGVzdGltYWNpw7NuIGNvbnRlbXBvcmFuZWEgZWwgY29lZmljaWVudGUgZXN0aW1hZG8gZW50cmUgZXNhcyBkb3MgdmFyaWFibGVzIHNlYSBzaWduaWZpY2F0aXZvLiBObyBvYnN0YW50ZSBwb2RlbW9zIHBlbnNhcg0KKioqDQpBaG9yYSBwcm9jZWRlbW9zIGEgb2J0ZW5lciBlbCBwcm9tZWRpbyBhbnVhbCBwYXJhIGxhIHRhc2EgcmVwcmVzZW50YXRpdmEgZGVsIG1lcmNhZG8NCmBgYHtyfQ0KYXR0YWNoKEJEUHVudG8xX3kpDQphZ2dyZWdhdGUobWVhbl90cm1+eWVhcixkYXRhPUJEUHVudG8xX3ksIEZVTj1tZWFuKQ0KYGBgDQpBaG9yYSBwcm9jZWRlbW9zIGEgb2J0ZW5lciBlbCBwcm9tZWRpbyBhbnVhbCBkZWwgcHJlY2lvIGludGVybmFjaW9uYWwgZGVsIHBldHLDs2xlbw0KYGBge3J9DQphZ2dyZWdhdGUobWVhbl9icmVudH55ZWFyLGRhdGE9QkRQdW50bzFfeSwgRlVOPW1lYW4pDQpgYGANCkFob3JhIG9idGVuZW1vcyBlbCBwcmVjaW8gcHJvbWVkaW8gcGFyYSBjYWRhIG1lcyB5IGNhZGEgYcOxbw0KYGBge3J9DQphZ2dyZWdhdGUobWVhbl90cm1+bW9udGgqeWVhcixkYXRhPUJEUHVudG8xX20sIEZVTj1tZWFuKQ0KYGBgDQpgYGB7cn0NCmFnZ3JlZ2F0ZShtZWFuX2JyZW50fm1vbnRoKnllYXIsZGF0YT1CRFB1bnRvMV9tLCBGVU49bWVhbikNCmBgYA0KDQpgYGB7cn0NCkJEUHVudG8xX20kbW9udGg8LXN0cmZ0aW1lKEJEUHVudG8xX20kbW9udGgsIGZvcm1hdCA9ICIlQiIpDQpCRFB1bnRvMV9tJG1vbnRoPC1zdHJmdGltZShCRFB1bnRvMV9tJG1vbnRoLCBsZXZlbHM9IG1vbnRoLm5hbWUpDQphZ2dyZWdhdGUobWVhbl9icmVudH4qbW9udGgsZGF0YT1CRFB1bnRvMV9tLEZVTj1tZWFuKQ0KYGBgDQoNClByb2NlZGVtb3MgYSByZXByZXNlbnRhcmxvIGVuIHVuIGdyw6FmaWNvDQpgYGB7cn0NCmFnZ3JlZ2F0ZShtZWFuX3RybX55ZWFyKm1vbnRoLGRhdGE9QkRQdW50bzFfbSwgRlVOPW1lYW4pJT4lIA0KICBwbG90X2x5KA0KICAgICAgICAgIHggPSB+bW9udGgsDQogICAgICAgICB5ID0gfm1lYW5fdHJtLA0KICAgICAgICAgdHlwZSA9ICJzY2F0dGVyIiAsbW9kZSA9ICJsaW5lcyIsDQogICAgICAgICBzcGxpdCA9IH55ZWFyLA0KICAgICAgICAgbGluZT1saXN0KHdpZHRoPTEpKSU+JQ0KICBsYXlvdXQodGl0bGU9J1Byb21lZGlvIGRpYXJpbyBtZW5zdWFsIGRlIGxhIFRSTScsDQogICAgICAgICB4YXhpcz1saXN0KHRpdGxlPSJEw61hcyIpLA0KICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0iQ09QL1VTRCIpKQ0KYGBgDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KYWdncmVnYXRlKG1lYW5fYnJlbnR+eWVhciptb250aCxkYXRhPUJEUHVudG8xX20sIEZVTj1tZWFuKSU+JSANCiAgcGxvdF9seSgNCiAgICAgICAgICB4ID0gfm1vbnRoLA0KICAgICAgICAgeSA9IH5tZWFuX2JyZW50LA0KICAgICAgICAgdHlwZSA9ICJzY2F0dGVyIiAsbW9kZSA9ICJsaW5lcyIsDQogICAgICAgICBzcGxpdCA9IH55ZWFyLA0KICAgICAgICAgbGluZT1saXN0KHdpZHRoPTEpKSU+JQ0KICBsYXlvdXQodGl0bGU9J1Byb21lZGlvIGRpYXJpbyBtZW5zdWFsIGRlbCBCYXJyaWwgZGUgUGV0csOzbGVvIEJyZW50JywNCiAgICAgICAgIHhheGlzPWxpc3QodGl0bGU9IkTDrWFzIiksDQogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSJVU0QiKSkNCmBgYA0KIyMjIEltcG9ydGFuY2lhIGRlIGVzdGFzIGRvcyB2YXJpYWJsZXMNCkxhIGFjdGl2aWRhZCBlY29uw7NtaWNhIGNvbG9tYmlhbmEgaGEgc3VmcmlkbyBub3RhYmxlcyBjYW1iaW9zIHJlc3BlY3RvIGEgc3UgbWF0ZXJpYSBwcmltYSBkZSBpbnRlcsOpcywgY2FzaSBkdXJhbnRlIHRvZG8gZWwgc2lnbG8gWFggZWwgcHJlY2lvIGludGVybmFjaW9uYWwgZGUgcmVmZXJlbmNpYSBwYXJhIGxhIGVjb25vbcOtYSBlcmEgZWwgcHJlY2lvIGRlbCBjYWbDqSwgbm8gb2JzdGFudGUgZGVzZGUgZWwgZGVzY3VicmltaWVudG8gZGUgbG9zIHlhY2ltaWVudG9zIGRlIEN1c2lhbmEgeSBSdWJpYWxlcyBoaXpvIHF1ZSBsZW50YW1lbnRlIGxhIGFjdGl2aWRhZCBkZWwgcGV0csOzbGVvIHRvbWFyw6EgbWF5b3IgcmVsZXZhbmNpYSBwYXJhIG51ZXN0cmEgZWNvbm9tw61hIGFsIGNvbnN0aXR1aXJzZSBlbiBlbCBwcmluY2lwYWwgcHJvZHVjdG8gZGUgZXhwb3J0YWNpw7NuLiBMYSBpbXBvcnRhbmNpYSBkZWwgcHJlY2lvIGRlbCBwZXRyw7NsZW8gZXMgdGFsIHF1ZSBkdXJhbnRlIGxhIGNyaXNpcyBkZWwgcGV0csOzbGVvIGVuIGVsIDIwMTQgc2UgdHV2aWVyb24gY29uc2VjdWVuY2lhcyBpbXBvcnRhbnRlcyBwYXJhIGVsIHBhw61zICwgcXVlIG9ibGlnYXJvbiBhIHJlYWxpemFyIHJlZm9ybWFzIHRyaWJ1dGFyaWFzLCBhanVzdGFyIGVsIGdhc3RvIGVzdGF0YWwuDQpDb21vIHNlIG9ic2VydmEgZW4gbGEgZ3LDoWZpY2EgZGVsIEJyZW50LCBlc3RlIGhhIHRlbmlkbyBjYcOtZGFzIGltcG9ydGFudGVzIGVuIDIwMTQgIGNvbW8gY29uc2VjdWVuY2lhIGRlbCBkZXNjdWJyaW1pZW50byBlbiB0w6ljbmljYXMgZGUgU2hhbGUgR2FzIHkgU2hhbGUgT2lsLCB5IGxhIHNvYnJlb2ZlcnRhIGRlIGxhIE9QRVAuIER1cmFudGUgZXN0ZSBhw7FvLCBodWJvIG5vdGFibGVzIGNhw61kYXMgZW4gZWwgcHJlY2lvIGRlbCBwZXRyw7NsZW8gcHJvZHVjdG8gZGUgdW5hcyB0ZW5zaW9uZXMgZW50cmUgbGEgT1BFUCBlbiBjYWJlemEgZGUgQXJhYmlhIFNhdWRpdGEgeSBSdXNpYSBsbGV2YW5kbyBhIGRldGVyaW9yb3MgZW4gbGEgcmVsYWNpw7NuIGVudHJlIGxhIE9QRVAgeSBsYSBPUEVQKy4gTm8gb2JzdGFudGUsIHRvZG8gZXN0YXMgZGlzcHV0YXMgc2Ugc29sdWNpb25hcsOtYW4gZW4gbWVkaW8gZGVsIGNvbmZpbmFtaWVudG8gbXVuZGlhbCBwcm9kdWN0byBkZSBsYSBwYW5kZW1pYSBkZWwgU0FSUy1DT1YyLCBjb211bm1lbnRlIGNvbm9jaWRvIGNvbW8gQ09WSUQtMTkuDQoNCkRhZGEgbGEgZnVlcnRlIGltcG9ydGFuY2lhIHF1ZSB0aWVuZSBwYXJhIENvbG9tYmlhIGxhcyByZW50YXMgcGV0csOzbGVyYXMgeSBlbCBmbHVqbyBkZSBkaW5lcm8gcXVlIGxsZWdhIGRlIGRpdmlzYXMgY29tbyBwcm9kdWN0byBkZSBsYSB2ZW50YSBkZSBiYXJyaWxlcyBkZSBwZXRyw7NsZW8gZWwgY29tcG9ydGFtaWVudG8gZGUgbGEgdGFzYSByZXByZXNlbnRhdGl2YSBkZWwgbWVyY2FkbyAodHJtLCBlbiBhZGVsYW50ZSkgZGVwZW5kZSBtdWNobyBkZWwgcHJlY2lvIGludGVybmFjaW9uYWwuIFNpIGJpZW4sIGhheSB1bmEgZGVwZW5kZW5jaWEgZW50cmUgZXN0YXMgdmFyaWFibGVzZXMgYnVlbm8gY29uc2lkZXJhciBzaSBleGlzdGUgdW5hIHBvc2libGUgY29pbnRlZ3JhY2nDs24gZGUgZXN0b3MgcHJvY2Vzb3MsIHBhcmEgZXZpdGFyIGFzw60gdW5hIHBvc2libGUgcmVsYWNpw7NuIGVzcHVyaWEuDQoNCmBgYHtyfQ0KcmVsPC1sbShsdHJtfmxicmVudCkNCnJlbA0KYGBgDQogUG9kZW1vcyBzZcOxYWxhciBxdWUgZGUgYWN1ZXJkbyBhIGxhcyBwcnVlYmFzIGRlIHJhw61jZXMgdW5pdGFyaWFzLCB5IGJham8gbG8gcHJvcHVlc3RvIHBvciBHcmFuZ2VyIGVuIDE5ODYgY29uIGxhcyBwcnVlYmFzIGRlIGNvaW50ZWdyYWNpw7NuIHNlIHB1ZWRlIGFzdW1pciBxdWUgbGEgdHJtIHkgZWwgcHJlY2lvIGRlbCBwZXRyw7NsZW8gYnJlbnQgc2UgZW5jdWVudHJhbiBjb2ludGVncmFkYXMsIGVzIGRlY2lyLCBoYXkgdW5hIHJlbGFjacOzbiBkZSBsYXJnbyBwbGF6byBlbnRyZSBsYXMgZG9zLCBzaWVuZG8gZXN0w6EgdW5hIGVsYXN0aWNpZGFkIGRlIGxhcmdvIHBsYXpvIGRlIC0wLjUzLg0KIEF1bnF1ZSBubyBlcyBlbCBvYmpldGl2byBkZWwgdHJhYmFqbyBzdWdpZXJvIHVuIG1vZGVsbyBkZSBtZWNhbmlzbW8gZGUgY29ycmVjY2nDs24gZGUgZXJyb3Jlcy4NCiBHUkFOR0VSLCBDLlcuSiAoMTk4NikgIyMiRGV2ZWxvcG1lbnRzIGluIHRoZSBTdHVkeSBvZiBDby1JbnRlZ3JhdGVkIEVjb25vbWljIFZhcmlhYmxlcyIjLiBPeGZvcmQgQnVsbGV0aW4gb2YgRWNvbm9taWNzIGFuZCBTdGF0aXN0aWNzLg0KDQojIFBhcnRlIDINCiMjIFRyYWVtb3MgbG9zIGRhdG9zDQpgYGB7cn0NCmxpYnJhcnkocXVhbnRtb2QpDQphcHBsZTwtZ2V0U3ltYm9scygiQUFQTCIsIGZyb209IjIwMTktMDEtMDEiLCBzcmM9InlhaG9vIiwgYXV0by5hc3NpZ24gPSBGKVssNl0NCm1pY3Jvc29mdDwtZ2V0U3ltYm9scygiTVNGVCIsIGZyb209IjIwMTktMDEtMDEiLCBzcmM9InlhaG9vIiwgYXV0by5hc3NpZ24gPSBGKVssNl0gDQphbWF6b248LWdldFN5bWJvbHMoIkFNWk4iLCBmcm9tPSIyMDE5LTAxLTAxIiwgc3JjPSJ5YWhvbyIsIGF1dG8uYXNzaWduID0gRilbLDZdIA0KZmFjZWJvb2s8LWdldFN5bWJvbHMoIkZCIiwgZnJvbT0iMjAxOS0wMS0wMSIsIHNyYz0ieWFob28iLCBhdXRvLmFzc2lnbiA9IEYpWyw2XSANCmdvb2dsZTwtZ2V0U3ltYm9scygiR09PR0wiLCBmcm9tPSIyMDE5LTAxLTAxIiwgc3JjPSJ5YWhvbyIsIGF1dG8uYXNzaWduID0gRilbLDZdIA0KRGF0b3MucHJ1ZWJhPC1kYXRhLmZyYW1lKGFwcGxlLCBtaWNyb3NvZnQsIGFtYXpvbiwgZmFjZWJvb2ssIGdvb2dsZSkNCmBgYA0KTGFzIHNlcmllcyBlc2NvZ2lkYXMsIGZ1ZXJvbiBsYXMgdGVjbm9sw7NnaWNhcywgZGFkYSBzdSBhbHRhIHZhbG9yYWNpw7NuIGVuIGVsIG1lcmNhZG8geSBlbCBpbnRlcsOpcyBxdWUgZGVzcGllcnRhbiBlbiBlc3BlY2lhbCBwb3Igc3VzIGF2YW5jZXMgcXVlIGhhbiBsbGV2YWRvIGEgcGVuc2FyIHF1ZSBlc3RhcyBpbmN1cnNpb25lbiBlbiBsb3MgbWVyY2Fkb3MgZmluYW5jaWVyb3MgY29uIHN1cyBwcm9waW9zIGJhbmNvcyBvIGhhc3RhIHN1cyBwcm9waWFzIG1vbmVkYXMgY29tbyBpbnRlbnRvIHJlYWxpemFybG8gRmFjZWJvb2sgY29uIExpYnJhLCBsYSBjdWFsIGhhIHRlbmlkbyB1bmEgc2VyaWUgZGUgdHJvcGllem9zIGRlc2RlIHN1IGFudW5jaW8sIGVuIGxvcyBxdWUgc29jaW9zIGVzdHJhdGVnaWNvcyBkZWwgcHJveWVjdG8gaGFuIGRlY2lkaWRvIHJldGlyYXIgc3UgcGFydGljaXBhY2nDs24gZW4gbGEgaW5pY2lhdGl2YSBkZSBGYWNlYm9vay4NCmBgYHtyfQ0KYmFyQ2hhcnQoYXBwbGUpDQpiYXJDaGFydChhbWF6b24pDQpiYXJDaGFydChmYWNlYm9vaykNCmJhckNoYXJ0KGdvb2dsZSkNCmJhckNoYXJ0KG1pY3Jvc29mdCkNCmBgYA0KRW4gZ2VuZXJhbCBvYnNlcnZhbW9zIHF1ZSB0b2RhcyBlc3RhcyBzZXJpZXMgdHV2aWVyb24gdW5hIGNhw61kYSBpbXBvcnRhbnRlIGVuIGVsIG1lcyBkZSBtYXJ6byBwcm9kdWN0byBkZSBsYSBwYW5kZW1pYSBkZWwgQ09WSUQtMTksIGF1bnF1ZSBoYW4gdGVuaWRvIHVuYSBub3RhYmxlIHJlY3VwZXJhY2nDs24sIGRhZG8gcXVlIGVzdGUgZXMgdW5vIGRlIGxvcyBzZWN0b3JlcyBtZW5vcyBhZmVjdGFkbyBwb3IgbGEgcGFuZGVtaWEgZSBpbmNsdXNvIGFsZ3VuYXMgZGUgZXN0YXMgZW1wcmVzYXMsIEFtYXpvbiBwb3IgZWplbXBsbywgc2UgaGEgdmlzdG8gZmF2b3JlY2lkYSBwb3IgbG9zIGNvbmZpbmFtaWVudG9zIGdlbmVyYWxpemFkb3MgYSBuaXZlbCBtdW5kaWFsIGRlYmlkbyBhIHF1ZSBzdSBtb2RlbG8gZGUgbmVnb2NpbyBzZSBiYXNhIGVuIGxhcyBjb21wcmFzIHBvciBpbnRlcm5ldC4gDQojIyBBcHBsZQ0KYGBge3J9DQojIENhbGN1bGFtb3MgbG9zIHJlbmRpbWllbnRvcw0KYXBwbGVyZW5kczwtUk9DKGFwcGxlLHR5cGU9ImRpc2NyZXRlIixuYS5wYWQgPSBUKQ0KYXBwbGVyZW5kbDwtUk9DKGFwcGxlLHR5cGU9ImNvbnRpbnVvdXMiLG5hLnBhZCA9IFQpDQpEYXRvcy5hcHBsZTwtZGF0YS5mcmFtZShhcHBsZSxhcHBsZXJlbmRzLGFwcGxlcmVuZGwpDQpwbG90KERhdG9zLmFwcGxlJEFBUEwuQWRqdXN0ZWQuMSwgdHlwZT0ibCIpDQpwbG90KERhdG9zLmFwcGxlJEFBUEwuQWRqdXN0ZWQuMiwgdHlwZT0ibCIpDQpgYGANCg0KIyMgQW1hem9uDQpgYGB7cn0NCiMgQ2FsY3VsYW1vcyBsb3MgcmVuZGltaWVudG9zDQphbWF6b25yZW5kczwtUk9DKGFtYXpvbix0eXBlPSJkaXNjcmV0ZSIsbmEucGFkID0gVCkNCmFtYXpvbnJlbmRsPC1ST0MoYW1hem9uLHR5cGU9ImNvbnRpbnVvdXMiLG5hLnBhZCA9IFQpDQpEYXRvcy5hbWF6b248LWRhdGEuZnJhbWUoYW1hem9uLGFtYXpvbnJlbmRzLGFtYXpvbnJlbmRsKQ0KcGxvdChEYXRvcy5hbWF6b24kQU1aTi5BZGp1c3RlZC4xLCB0eXBlPSJsIikNCnBsb3QoRGF0b3MuYW1hem9uJEFNWk4uQWRqdXN0ZWQuMiwgdHlwZT0ibCIpDQpgYGANCg0KIyMgRmFjZWJvb2sNCmBgYHtyfQ0KIyBDYWxjdWxhbW9zIGxvcyByZW5kaW1pZW50b3MNCmZhY2Vib29rcmVuZHM8LVJPQyhmYWNlYm9vayx0eXBlPSJkaXNjcmV0ZSIsbmEucGFkID0gVCkNCmZhY2Vib29rcmVuZGw8LVJPQyhmYWNlYm9vayx0eXBlPSJjb250aW51b3VzIixuYS5wYWQgPSBUKQ0KRGF0b3MuZmFjZWJvb2s8LWRhdGEuZnJhbWUoZmFjZWJvb2ssZmFjZWJvb2tyZW5kcyxmYWNlYm9va3JlbmRsKQ0KcGxvdChEYXRvcy5mYWNlYm9vayRGQi5BZGp1c3RlZC4xLCB0eXBlPSJsIikNCnBsb3QoRGF0b3MuZmFjZWJvb2skRkIuQWRqdXN0ZWQuMiwgdHlwZT0ibCIpDQpgYGANCg0KIyMgR29vZ2xlDQpgYGB7cn0NCiMgQ2FsY3VsYW1vcyBsb3MgcmVuZGltaWVudG9zDQpnb29nbGVyZW5kczwtUk9DKGdvb2dsZSx0eXBlPSJkaXNjcmV0ZSIsbmEucGFkID0gVCkNCmdvb2dsZXJlbmRsPC1ST0MoZ29vZ2xlLHR5cGU9ImNvbnRpbnVvdXMiLG5hLnBhZCA9IFQpDQpEYXRvcy5nb29nbGU8LWRhdGEuZnJhbWUoZ29vZ2xlLGdvb2dsZXJlbmRzLGdvb2dsZXJlbmRsKQ0KcGxvdChEYXRvcy5nb29nbGUkR09PR0wuQWRqdXN0ZWQuMSwgdHlwZT0ibCIpDQpwbG90KERhdG9zLmdvb2dsZSRHT09HTC5BZGp1c3RlZC4yLCB0eXBlPSJsIikNCmBgYA0KDQojIyBNaWNyb3NvZnQNCmBgYHtyfQ0KIyBDYWxjdWxhbW9zIGxvcyByZW5kaW1pZW50b3MNCm1pY3Jvc29mdHJlbmRzPC1ST0MobWljcm9zb2Z0LHR5cGU9ImRpc2NyZXRlIixuYS5wYWQgPSBUKQ0KbWljcm9zb2Z0cmVuZGw8LVJPQyhtaWNyb3NvZnQsdHlwZT0iY29udGludW91cyIsbmEucGFkID0gVCkNCkRhdG9zLm1pY3Jvc29mdDwtZGF0YS5mcmFtZShtaWNyb3NvZnQsbWljcm9zb2Z0cmVuZHMsbWljcm9zb2Z0cmVuZGwpDQpwbG90KERhdG9zLm1pY3Jvc29mdCRNU0ZULkFkanVzdGVkLjEsIHR5cGU9ImwiKQ0KcGxvdChEYXRvcy5taWNyb3NvZnQkTVNGVC5BZGp1c3RlZC4yLCB0eXBlPSJsIikNCmBgYA0KDQoNCiMgUHVudG8gMyBTUUwNCg0KU2UgZW5jdWVudHJhIGVuIG90cm8gYXJjaGl2bw==